package it.orma.iridehr.entities;

import java.io.Serializable;
import java.net.URLEncoder;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.Lob;


import org.apache.commons.codec.binary.Base64;
import org.springframework.format.annotation.DateTimeFormat;

@Entity
@Table(name = "DATI_GENERALI")
public class DatiGenerali extends EntitaBase implements Serializable {

	private static final long serialVersionUID = 1888589983127765145L;
	
	@Id
	@Column(name = "ID_DATI_GENERALI")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long idDatiGenerali;
	
	@Column(name = "DS_NOME", length = 50, nullable = false)
	private String nome;
	
	@Column(name = "DS_COGNOME", length = 50, nullable = false)
	private String cognome;
	
	@Temporal(TemporalType.DATE)
	@Column(name = "DT_NASCITA", nullable = true)
	private Date dataDiNascita;
	
	@Column(name = "DS_COMUNE_NASCITA", length = 100, nullable = false)
	private String comuneDiNascita;
	
	@Column(name = "DS_PROVINCIA_NASCITA", length = 100, nullable = false)
	private String provinciaDiNascita;
	
	@Column(name = "DS_NAZIONALITA", length = 50)
	private String nazionalita;
	
	@Column(name = "DS_NAZIONALITA2", length = 50)
	private String nazionalita2;
	
	@Column(name = "DS_SESSO", length = 1)
	private String sesso;
	
	@Column(name = "DS_ST_CIVILE", length = 20)
	private String statoCivile;
	
	@Column(name = "NM_FIGLI")
	private Integer numeroFigli;
	
	@Column(name = "DS_ATTIVITA_CONIUGE", length = 250)
	private String attivitaConiuge;
	
	@Column(name = "DS_TELEFONO_CASA", length = 50)
	private String telefonoCasa;
	
	@Column(name = "DS_TELEFONO_CELL1", length = 50)
	private String telefonoCell1;
	
	@Column(name = "DS_TELEFONO_CELL2", length = 50)
	private String telefonoCell2;
	
	@Column(name = "DS_MAIL1", length = 50)
	private String mail1;
	
	@Column(name = "DS_MAIL2", length = 50)
	private String mail2;
	
	@Column(name = "DS_INDIRIZZO_RESIDENZA", length = 70)
	private String indirizzoResidenza;
	
	@Column(name = "DS_CAP_RESIDENZA", length = 5)
	private String capResidenza;
	
	@Column(name = "DS_COMUNE_RESIDENZA", length = 50)
	private String comuneResidenza;
	
	@Column(name = "DS_PROVINCIA_RESIDENZA", length = 50)
	private String provinciaResidenza;
	
	@Column(name = "DS_INDIRIZZO_DOMICILIO", length = 70)
	private String indirizzoDomicilio;
	
	@Column(name = "DS_CAP_DOMICILIO", length = 5)
	private String capDomicilio;
	
	@Column(name = "DS_COMUNE_DOMICILIO", length = 50)
	private String comumeDomicilio;
	
	@Column(name = "DS_PROVINCIA_DOMICILIO", length = 50)
	private String provinciaDomicilio;
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "FK_SCHEDA_CANDIDATO")
	private SchedaCandidato schedaCandidato;

	@Lob
	@Column(name="FOTO")
	private byte[] foto;
	
	@Column(name="TIPO_FOTO")
	private String tipoFoto;
	
	@Transient
	private boolean haFigli;
	
	@Transient
	private boolean fotoUpload;

	@Transient
    private Long idNews;
	
	public DatiGenerali() {
		super();
		if (this.numeroFigli!=null && this.numeroFigli>0){
			this.haFigli=true;
		}
			
	}

	public Long getIdDatiGenerali() {
		return idDatiGenerali;
	}

	public void setIdDatiGenerali(Long idDatiGenerali) {
		this.idDatiGenerali = idDatiGenerali;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCognome() {
		return cognome;
	}

	public void setCognome(String cognome) {
		this.cognome = cognome;
	}
	
	@DateTimeFormat(pattern="dd/MM/yyyy")
	public Date getDataDiNascita() {
		return dataDiNascita;
	}

	public void setDataDiNascita(Date dataDiNascita) {
		this.dataDiNascita = dataDiNascita;
	}

	public String getComuneDiNascita() {
		return comuneDiNascita;
	}

	public void setComuneDiNascita(String comuneDiNascita) {
		this.comuneDiNascita = comuneDiNascita;
	}

	public String getProvinciaDiNascita() {
		return provinciaDiNascita;
	}

	public void setProvinciaDiNascita(String provinciaDiNascita) {
		this.provinciaDiNascita = provinciaDiNascita;
	}

	public String getNazionalita() {
		return nazionalita;
	}

	public void setNazionalita(String nazionalita) {
		this.nazionalita = nazionalita;
	}

	public String getNazionalita2() {
		return nazionalita2;
	}

	public void setNazionalita2(String nazionalita2) {
		this.nazionalita2 = nazionalita2;
	}

	public String getSesso() {
		return sesso;
	}

	public void setSesso(String sesso) {
		this.sesso = sesso;
	}

	public String getStatoCivile() {
		return statoCivile;
	}

	public void setStatoCivile(String statoCivile) {
		this.statoCivile = statoCivile;
	}

	public Integer getNumeroFigli() {
		
		return numeroFigli;
	}

	public void setNumeroFigli(Integer numeroFigli) {
		this.numeroFigli = numeroFigli;
		
	}
	
	public void setHaFigli(boolean haFigli) {
		this.haFigli = haFigli;
	}
	
	public boolean isHaFigli() {
		return haFigli;
	}

	public String getAttivitaConiuge() {
		return attivitaConiuge;
	}

	public void setAttivitaConiuge(String attivitaConiuge) {
		this.attivitaConiuge = attivitaConiuge;
	}

	public String getTelefonoCasa() {
		return telefonoCasa;
	}

	public void setTelefonoCasa(String telefonoCasa) {
		this.telefonoCasa = telefonoCasa;
	}

	public String getTelefonoCell1() {
		return telefonoCell1;
	}

	public void setTelefonoCell1(String telefonoCell1) {
		this.telefonoCell1 = telefonoCell1;
	}

	public String getTelefonoCell2() {
		return telefonoCell2;
	}

	public void setTelefonoCell2(String telefonoCell2) {
		this.telefonoCell2 = telefonoCell2;
	}

	public String getMail1() {
		return mail1;
	}

	public void setMail1(String mail1) {
		this.mail1 = mail1;
	}

	public String getMail2() {
		return mail2;
	}

	public void setMail2(String mail2) {
		this.mail2 = mail2;
	}

	public String getIndirizzoResidenza() {
		return indirizzoResidenza;
	}

	public void setIndirizzoResidenza(String indirizzoResidenza) {
		this.indirizzoResidenza = indirizzoResidenza;
	}

	public String getCapResidenza() {
		return capResidenza;
	}

	public void setCapResidenza(String capResidenza) {
		this.capResidenza = capResidenza;
	}

	public String getComuneResidenza() {
		return comuneResidenza;
	}

	public void setComuneResidenza(String comuneResidenza) {
		this.comuneResidenza = comuneResidenza;
	}

	public String getProvinciaResidenza() {
		return provinciaResidenza;
	}

	public void setProvinciaResidenza(String provinciaResidenza) {
		this.provinciaResidenza = provinciaResidenza;
	}

	public String getIndirizzoDomicilio() {
		return indirizzoDomicilio;
	}

	public void setIndirizzoDomicilio(String indirizzoDomicilio) {
		this.indirizzoDomicilio = indirizzoDomicilio;
	}

	public String getCapDomicilio() {
		return capDomicilio;
	}

	public void setCapDomicilio(String capDomicilio) {
		this.capDomicilio = capDomicilio;
	}

	public String getComumeDomicilio() {
		return comumeDomicilio;
	}

	public void setComumeDomicilio(String comumeDomicilio) {
		this.comumeDomicilio = comumeDomicilio;
	}

	public String getProvinciaDomicilio() {
		return provinciaDomicilio;
	}

	public void setProvinciaDomicilio(String provinciaDomicilio) {
		this.provinciaDomicilio = provinciaDomicilio;
	}

	public SchedaCandidato getSchedaCandidato() {
		return schedaCandidato;
	}

	public void setSchedaCandidato(SchedaCandidato schedaCandidato) {
		this.schedaCandidato = schedaCandidato;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((idDatiGenerali == null) ? 0 : idDatiGenerali.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		DatiGenerali other = (DatiGenerali) obj;
		if (idDatiGenerali == null) {
			if (other.idDatiGenerali != null)
				return false;
		} else if (!idDatiGenerali.equals(other.idDatiGenerali))
			return false;
		return true;
	}

	public Long getIdNews() {
		return idNews;
	}

	public void setIdNews(Long idNews) {
		this.idNews = idNews;
	}

	public byte[] getFoto() {
		return foto;
	}

	public void setFoto(byte[] foto) {
		this.foto = foto;
	}
	
	public String getFotoBase64() {
		if (foto!=null)
			return URLEncoder.encode(Base64.encodeBase64String(foto));
		return "";
	}

	public boolean isFotoUpload() {
		return fotoUpload;
	}

	public void setFotoUpload(boolean fotoUpload) {
		this.fotoUpload = fotoUpload;
	}

	public String getTipoFoto() {
		return tipoFoto;
	}

	public void setTipoFoto(String tipoFoto) {
		this.tipoFoto = tipoFoto;
	}
	
}
